EIP,EBP,ESP都是系统的寄存器, 堆栈空间 理解

您所在的位置:网站首页 eip寄存器 工作原理 EIP,EBP,ESP都是系统的寄存器, 堆栈空间 理解

EIP,EBP,ESP都是系统的寄存器, 堆栈空间 理解

2024-04-21 09:35| 来源: 网络整理| 查看: 265

http://blog.csdn.net/djbtestingsky/article/details/1884678

ebp寄存器,在面向X86的CPU的程序中这个寄存器通常用来保存栈顶地址。参考http://blogs.msdn.com/oldnewthing/archive/2004/01/16/59415.aspx

 

栈顶  是高地址.

 

栈底是低地址.

 

========================

 

 测试空间旗下大头针出品  EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址。  为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。  我们DC上讲过栈的数据结构,主要有以下特点:  后进先处。(这个强调过多)

其实它还有以下两个作用:  1.栈是用来存储临时变量,函数传递的中间结果。  2.操作系统维护的,对于程序员是透明的。 我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说说栈的原理。 先写个小程序: void fun(void) {    printf("hello world"); } void main(void) {   fun()   printf("函数调用结束"); } 这是一个再简单不过的函数调用的例子了。 当程序进行函数调用的时候,我们经常说的是先将函数压栈,当函数调用结束后,再出栈。这一切的工作都是系统帮我们自动完成的。 但在完成的过程中,系统会用到下面三种寄存器: 1.EIP 2.ESP 3.EBP 当调用fun函数开始时,三者的作用。 1.EIP寄存器里存储的是CPU下次要执行的指令的地址。  也就是调用完fun函数后,让CPU知道应该执行main函数中的printf("函数调用结束")语句了。 2.EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址,这个是一开始进行fun()函数调用之前,由ESP传递给EBP的。(在函数调用前你可以这么理解:ESP存储的是栈顶地址,也是栈底地址。) 3.ESP寄存器里存储的是在调用函数fun()之后,栈的栈顶。并且始终指向栈顶。   当调用fun函数结束后,三者的作用: 1.系统根据EIP寄存器里存储的地址,CPU就能够知道函数调用完,下一步应该做什么,也就是应该执行main函数中的printf(“函数调用结束”)。 2.EBP寄存器存储的是栈底地址,而这个地址是由ESP在函数调用前传递给EBP的。等到调用结束,EBP会把其地址再次传回给ESP。所以ESP又一次指向了函数调用结束后,栈顶的地址。 其实我们对这个只需要知道三个指针是什么就可以,可能对我们以后学习栈溢出的问题以及看栈这方面的书籍有些帮助。当有人再给你说EIP,ESP,EBP的时候,你不能一头雾水,那你水平就显得洼了许多。其实不知道我们照样可以编程,因为我们是C级别的程序员,而不是ASM级别的程序员。     上一篇冲动是一种习惯 下一篇生日快乐


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3